<?xml version='1.0' encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <link href="cpip.css" rel="stylesheet" type="text/css" />
    <title>File: /Users/paulross/dev/linux/linux-3.13/include/linux/rwsem.h</title>
  </head>
  <body>
    <h1>File: /Users/paulross/dev/linux/linux-3.13/include/linux/rwsem.h</h1>
    <p>Green shading in the line number column
means the source is part of the translation unit, red means it is conditionally excluded.
Highlighted line numbers link to the translation unit page. Highlighted macros link to
the macro page.</p>
    <pre><a name="1" /><span class="True">       1:</span> <span class="k">/* rwsem.h: R/W semaphores, public interface</span>
<a name="2" /><span class="True">       2:</span> <span class="k"> *</span>
<a name="3" /><span class="True">       3:</span> <span class="k"> * Written by David Howells (dhowells@redhat.com).</span>
<a name="4" /><span class="True">       4:</span> <span class="k"> * Derived from asm-i386/semaphore.h</span>
<a name="5" /><span class="True">       5:</span> <span class="k"> */</span>
<a name="6" /><span class="True">       6:</span> 
<a name="7" /><span class="Maybe">       7:</span> <span class="f">#</span><span class="n">ifndef</span> <a href="cpu.c_macros_ref.html#_X0xJTlVYX1JXU0VNX0hfMA__"><span class="b">_LINUX_RWSEM_H</span></a>
<a name="8" /><span class="Maybe">       8:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_X0xJTlVYX1JXU0VNX0hfMA__"><span class="b">_LINUX_RWSEM_H</span></a>
<a name="9" /><span class="Maybe">       9:</span> 
<a name="10" /><span class="Maybe">      10:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">linkage</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="11" /><span class="Maybe">      11:</span> 
<a name="12" /><span class="Maybe">      12:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">types</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="13" /><span class="Maybe">      13:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">kernel</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="14" /><span class="Maybe">      14:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">list</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="15" /><span class="Maybe">      15:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">spinlock</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="16" /><span class="Maybe">      16:</span> 
<a name="17" /><span class="Maybe">      17:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">atomic</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="18" /><span class="Maybe">      18:</span> 
<a name="19" /><span class="Maybe">      19:</span> <span class="m">struct</span> <span class="b">rw_semaphore</span><span class="f">;</span>
<a name="20" /><span class="Maybe">      20:</span> 
<a name="21" /><span class="False">      21:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_RWSEM_GENERIC_SPINLOCK</span>
<a name="22" /><span class="False">      22:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">rwsem</span><span class="f">-</span><span class="b">spinlock</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span> <span class="k">/* use a generic implementation */</span>
<a name="23" /><span class="Maybe">      23:</span> <span class="f">#</span><span class="n">else</span>
<a name="24" /><span class="Maybe">      24:</span> <span class="k">/* All arch specific implementations share the same struct */</span>
<a name="25" /><span class="Maybe">      25:</span> <span class="m">struct</span> <span class="b">rw_semaphore</span> <span class="f">{</span>
<a name="26" /><span class="Maybe">      26:</span>     <span class="m">long</span>            <span class="b">count</span><span class="f">;</span>
<a name="27" /><span class="Maybe">      27:</span>     <span class="b">raw_spinlock_t</span>        <span class="b">wait_lock</span><span class="f">;</span>
<a name="28" /><span class="Maybe">      28:</span>     <span class="m">struct</span> <span class="b">list_head</span>    <span class="b">wait_list</span><span class="f">;</span>
<a name="29" /><span class="False">      29:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_DEBUG_LOCK_ALLOC</span>
<a name="30" /><span class="False">      30:</span>     <span class="m">struct</span> <span class="b">lockdep_map</span>    <span class="b">dep_map</span><span class="f">;</span>
<a name="31" /><span class="Maybe">      31:</span> <span class="f">#</span><span class="n">endif</span>
<a name="32" /><span class="Maybe">      32:</span> <span class="f">}</span><span class="f">;</span>
<a name="33" /><span class="Maybe">      33:</span> 
<a name="34" /><span class="Maybe">      34:</span> <span class="m">extern</span> <span class="m">struct</span> <span class="b">rw_semaphore</span> <span class="f">*</span><span class="b">rwsem_down_read_failed</span><span class="f">(</span><span class="m">struct</span> <span class="b">rw_semaphore</span> <span class="f">*</span><span class="b">sem</span><span class="f">)</span><span class="f">;</span>
<a name="35" /><span class="Maybe">      35:</span> <span class="m">extern</span> <span class="m">struct</span> <span class="b">rw_semaphore</span> <span class="f">*</span><span class="b">rwsem_down_write_failed</span><span class="f">(</span><span class="m">struct</span> <span class="b">rw_semaphore</span> <span class="f">*</span><span class="b">sem</span><span class="f">)</span><span class="f">;</span>
<a name="36" /><span class="Maybe">      36:</span> <span class="m">extern</span> <span class="m">struct</span> <span class="b">rw_semaphore</span> <span class="f">*</span><span class="b">rwsem_wake</span><span class="f">(</span><span class="m">struct</span> <span class="b">rw_semaphore</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="37" /><span class="Maybe">      37:</span> <span class="m">extern</span> <span class="m">struct</span> <span class="b">rw_semaphore</span> <span class="f">*</span><span class="b">rwsem_downgrade_wake</span><span class="f">(</span><span class="m">struct</span> <span class="b">rw_semaphore</span> <span class="f">*</span><span class="b">sem</span><span class="f">)</span><span class="f">;</span>
<a name="38" /><span class="Maybe">      38:</span> 
<a name="39" /><span class="Maybe">      39:</span> <span class="k">/* Include the arch specific part */</span>
<a name="40" /><span class="Maybe">      40:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="m">asm</span><span class="f">/</span><span class="b">rwsem</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="41" /><span class="Maybe">      41:</span> 
<a name="42" /><span class="Maybe">      42:</span> <span class="k">/* In all implementations count != 0 means locked */</span>
<a name="43" /><span class="Maybe">      43:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">rwsem_is_locked</span><span class="f">(</span><span class="m">struct</span> <span class="b">rw_semaphore</span> <span class="f">*</span><span class="b">sem</span><span class="f">)</span>
<a name="44" /><span class="Maybe">      44:</span> <span class="f">{</span>
<a name="45" /><span class="Maybe">      45:</span>     <span class="m">return</span> <span class="b">sem</span><span class="f">-&gt;</span><span class="b">count</span> <span class="f">!=</span> <span class="c">0</span><span class="f">;</span>
<a name="46" /><span class="Maybe">      46:</span> <span class="f">}</span>
<a name="47" /><span class="Maybe">      47:</span> 
<a name="48" /><span class="Maybe">      48:</span> <span class="f">#</span><span class="n">endif</span>
<a name="49" /><span class="Maybe">      49:</span> 
<a name="50" /><span class="Maybe">      50:</span> <span class="k">/* Common initializer macros and functions */</span>
<a name="51" /><span class="Maybe">      51:</span> 
<a name="52" /><span class="False">      52:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_DEBUG_LOCK_ALLOC</span>
<a name="53" /><span class="False">      53:</span> <span class="f">#</span> <span class="n">define</span> <a href="cpu.c_macros_noref.html#_X19SV1NFTV9ERVBfTUFQX0lOSVRfMA__"><span class="b">__RWSEM_DEP_MAP_INIT</span></a><span class="f">(</span><span class="b">lockname</span><span class="f">)</span> <span class="f">,</span> <span class="f">.</span><span class="b">dep_map</span> <span class="f">=</span> <span class="f">{</span> <span class="f">.</span><span class="b">name</span> <span class="f">=</span> <span class="f">#</span><span class="b">lockname</span> <span class="f">}</span>
<a name="54" /><span class="Maybe">      54:</span> <span class="f">#</span><span class="n">else</span>
<a name="55" /><span class="Maybe">      55:</span> <span class="f">#</span> <span class="n">define</span> <a href="cpu.c_macros_noref.html#_X19SV1NFTV9ERVBfTUFQX0lOSVRfMA__"><span class="b">__RWSEM_DEP_MAP_INIT</span></a><span class="f">(</span><span class="b">lockname</span><span class="f">)</span>
<a name="56" /><span class="Maybe">      56:</span> <span class="f">#</span><span class="n">endif</span>
<a name="57" /><span class="Maybe">      57:</span> 
<a name="58" /><span class="Maybe">      58:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_X19SV1NFTV9JTklUSUFMSVpFUl8w"><span class="b">__RWSEM_INITIALIZER</span></a><span class="f">(</span><span class="b">name</span><span class="f">)</span>            \
<a name="59" /><span class="Maybe">      59:</span>     <span class="f">{</span> <a href="cpu.c_macros_noref.html#_UldTRU1fVU5MT0NLRURfVkFMVUVfMA__"><span class="b">RWSEM_UNLOCKED_VALUE</span></a><span class="f">,</span>                \
<a name="60" /><span class="Maybe">      60:</span>       <a href="cpu.c_macros_ref.html#_X19SQVdfU1BJTl9MT0NLX1VOTE9DS0VEXzA_"><span class="b">__RAW_SPIN_LOCK_UNLOCKED</span></a><span class="f">(</span><span class="b">name</span><span class="f">.</span><span class="b">wait_lock</span><span class="f">)</span><span class="f">,</span>    \
<a name="61" /><span class="Maybe">      61:</span>       <a href="cpu.c_macros_ref.html#_TElTVF9IRUFEX0lOSVRfMA__"><span class="b">LIST_HEAD_INIT</span></a><span class="f">(</span><span class="f">(</span><span class="b">name</span><span class="f">)</span><span class="f">.</span><span class="b">wait_list</span><span class="f">)</span>        \
<a name="62" /><span class="Maybe">      62:</span>       <a href="cpu.c_macros_noref.html#_X19SV1NFTV9ERVBfTUFQX0lOSVRfMA__"><span class="b">__RWSEM_DEP_MAP_INIT</span></a><span class="f">(</span><span class="b">name</span><span class="f">)</span> <span class="f">}</span>
<a name="63" /><span class="Maybe">      63:</span> 
<a name="64" /><span class="Maybe">      64:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_REVDTEFSRV9SV1NFTV8w"><span class="b">DECLARE_RWSEM</span></a><span class="f">(</span><span class="b">name</span><span class="f">)</span> \
<a name="65" /><span class="Maybe">      65:</span>     <span class="m">struct</span> <span class="b">rw_semaphore</span> <span class="b">name</span> <span class="f">=</span> <a href="cpu.c_macros_noref.html#_X19SV1NFTV9JTklUSUFMSVpFUl8w"><span class="b">__RWSEM_INITIALIZER</span></a><span class="f">(</span><span class="b">name</span><span class="f">)</span>
<a name="66" /><span class="Maybe">      66:</span> 
<a name="67" /><span class="Maybe">      67:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">__init_rwsem</span><span class="f">(</span><span class="m">struct</span> <span class="b">rw_semaphore</span> <span class="f">*</span><span class="b">sem</span><span class="f">,</span> <span class="m">const</span> <span class="m">char</span> <span class="f">*</span><span class="b">name</span><span class="f">,</span>
<a name="68" /><span class="Maybe">      68:</span>              <span class="m">struct</span> <span class="b">lock_class_key</span> <span class="f">*</span><span class="b">key</span><span class="f">)</span><span class="f">;</span>
<a name="69" /><span class="Maybe">      69:</span> 
<a name="70" /><span class="Maybe">      70:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_aW5pdF9yd3NlbV8w"><span class="b">init_rwsem</span></a><span class="f">(</span><span class="b">sem</span><span class="f">)</span>                        \
<a name="71" /><span class="Maybe">      71:</span> <span class="m">do</span> <span class="f">{</span>                                \
<a name="72" /><span class="Maybe">      72:</span>     <span class="m">static</span> <span class="m">struct</span> <span class="b">lock_class_key</span> <span class="b">__key</span><span class="f">;</span>            \
<a name="73" /><span class="Maybe">      73:</span>                                 \
<a name="74" /><span class="Maybe">      74:</span>     <span class="b">__init_rwsem</span><span class="f">(</span><span class="f">(</span><span class="b">sem</span><span class="f">)</span><span class="f">,</span> <span class="f">#</span><span class="b">sem</span><span class="f">,</span> <span class="f">&amp;</span><span class="b">__key</span><span class="f">)</span><span class="f">;</span>            \
<a name="75" /><span class="Maybe">      75:</span> <span class="f">}</span> <span class="m">while</span> <span class="f">(</span><span class="c">0</span><span class="f">)</span>
<a name="76" /><span class="Maybe">      76:</span> 
<a name="77" /><span class="Maybe">      77:</span> <span class="k">/*</span>
<a name="78" /><span class="Maybe">      78:</span> <span class="k"> * lock for reading</span>
<a name="79" /><span class="Maybe">      79:</span> <span class="k"> */</span>
<a name="80" /><span class="Maybe">      80:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">down_read</span><span class="f">(</span><span class="m">struct</span> <span class="b">rw_semaphore</span> <span class="f">*</span><span class="b">sem</span><span class="f">)</span><span class="f">;</span>
<a name="81" /><span class="Maybe">      81:</span> 
<a name="82" /><span class="Maybe">      82:</span> <span class="k">/*</span>
<a name="83" /><span class="Maybe">      83:</span> <span class="k"> * trylock for reading -- returns 1 if successful, 0 if contention</span>
<a name="84" /><span class="Maybe">      84:</span> <span class="k"> */</span>
<a name="85" /><span class="Maybe">      85:</span> <span class="m">extern</span> <span class="m">int</span> <span class="b">down_read_trylock</span><span class="f">(</span><span class="m">struct</span> <span class="b">rw_semaphore</span> <span class="f">*</span><span class="b">sem</span><span class="f">)</span><span class="f">;</span>
<a name="86" /><span class="Maybe">      86:</span> 
<a name="87" /><span class="Maybe">      87:</span> <span class="k">/*</span>
<a name="88" /><span class="Maybe">      88:</span> <span class="k"> * lock for writing</span>
<a name="89" /><span class="Maybe">      89:</span> <span class="k"> */</span>
<a name="90" /><span class="Maybe">      90:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">down_write</span><span class="f">(</span><span class="m">struct</span> <span class="b">rw_semaphore</span> <span class="f">*</span><span class="b">sem</span><span class="f">)</span><span class="f">;</span>
<a name="91" /><span class="Maybe">      91:</span> 
<a name="92" /><span class="Maybe">      92:</span> <span class="k">/*</span>
<a name="93" /><span class="Maybe">      93:</span> <span class="k"> * trylock for writing -- returns 1 if successful, 0 if contention</span>
<a name="94" /><span class="Maybe">      94:</span> <span class="k"> */</span>
<a name="95" /><span class="Maybe">      95:</span> <span class="m">extern</span> <span class="m">int</span> <span class="b">down_write_trylock</span><span class="f">(</span><span class="m">struct</span> <span class="b">rw_semaphore</span> <span class="f">*</span><span class="b">sem</span><span class="f">)</span><span class="f">;</span>
<a name="96" /><span class="Maybe">      96:</span> 
<a name="97" /><span class="Maybe">      97:</span> <span class="k">/*</span>
<a name="98" /><span class="Maybe">      98:</span> <span class="k"> * release a read lock</span>
<a name="99" /><span class="Maybe">      99:</span> <span class="k"> */</span>
<a name="100" /><span class="Maybe">     100:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">up_read</span><span class="f">(</span><span class="m">struct</span> <span class="b">rw_semaphore</span> <span class="f">*</span><span class="b">sem</span><span class="f">)</span><span class="f">;</span>
<a name="101" /><span class="Maybe">     101:</span> 
<a name="102" /><span class="Maybe">     102:</span> <span class="k">/*</span>
<a name="103" /><span class="Maybe">     103:</span> <span class="k"> * release a write lock</span>
<a name="104" /><span class="Maybe">     104:</span> <span class="k"> */</span>
<a name="105" /><span class="Maybe">     105:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">up_write</span><span class="f">(</span><span class="m">struct</span> <span class="b">rw_semaphore</span> <span class="f">*</span><span class="b">sem</span><span class="f">)</span><span class="f">;</span>
<a name="106" /><span class="Maybe">     106:</span> 
<a name="107" /><span class="Maybe">     107:</span> <span class="k">/*</span>
<a name="108" /><span class="Maybe">     108:</span> <span class="k"> * downgrade write lock to read lock</span>
<a name="109" /><span class="Maybe">     109:</span> <span class="k"> */</span>
<a name="110" /><span class="Maybe">     110:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">downgrade_write</span><span class="f">(</span><span class="m">struct</span> <span class="b">rw_semaphore</span> <span class="f">*</span><span class="b">sem</span><span class="f">)</span><span class="f">;</span>
<a name="111" /><span class="Maybe">     111:</span> 
<a name="112" /><span class="False">     112:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_DEBUG_LOCK_ALLOC</span>
<a name="113" /><span class="False">     113:</span> <span class="k">/*</span>
<a name="114" /><span class="False">     114:</span> <span class="k"> * nested locking. NOTE: rwsems are not allowed to recurse</span>
<a name="115" /><span class="False">     115:</span> <span class="k"> * (which occurs if the same task tries to acquire the same</span>
<a name="116" /><span class="False">     116:</span> <span class="k"> * lock instance multiple times), but multiple locks of the</span>
<a name="117" /><span class="False">     117:</span> <span class="k"> * same lock class might be taken, if the order of the locks</span>
<a name="118" /><span class="False">     118:</span> <span class="k"> * is always the same. This ordering rule can be expressed</span>
<a name="119" /><span class="False">     119:</span> <span class="k"> * to lockdep via the _nested() APIs, but enumerating the</span>
<a name="120" /><span class="False">     120:</span> <span class="k"> * subclasses that are used. (If the nesting relationship is</span>
<a name="121" /><span class="False">     121:</span> <span class="k"> * static then another method for expressing nested locking is</span>
<a name="122" /><span class="False">     122:</span> <span class="k"> * the explicit definition of lock class keys and the use of</span>
<a name="123" /><span class="False">     123:</span> <span class="k"> * lockdep_set_class() at lock initialization time.</span>
<a name="124" /><span class="False">     124:</span> <span class="k"> * See Documentation/lockdep-design.txt for more details.)</span>
<a name="125" /><span class="False">     125:</span> <span class="k"> */</span>
<a name="126" /><span class="False">     126:</span> <span class="m">extern</span> <span class="m">void</span> <a href="cpu.c_macros_noref.html#_ZG93bl9yZWFkX25lc3RlZF8w"><span class="b">down_read_nested</span></a><span class="f">(</span><span class="m">struct</span> <span class="b">rw_semaphore</span> <span class="f">*</span><span class="b">sem</span><span class="f">,</span> <span class="m">int</span> <span class="b">subclass</span><span class="f">)</span><span class="f">;</span>
<a name="127" /><span class="False">     127:</span> <span class="m">extern</span> <span class="m">void</span> <a href="cpu.c_macros_noref.html#_ZG93bl93cml0ZV9uZXN0ZWRfMA__"><span class="b">down_write_nested</span></a><span class="f">(</span><span class="m">struct</span> <span class="b">rw_semaphore</span> <span class="f">*</span><span class="b">sem</span><span class="f">,</span> <span class="m">int</span> <span class="b">subclass</span><span class="f">)</span><span class="f">;</span>
<a name="128" /><span class="False">     128:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">_down_write_nest_lock</span><span class="f">(</span><span class="m">struct</span> <span class="b">rw_semaphore</span> <span class="f">*</span><span class="b">sem</span><span class="f">,</span> <span class="m">struct</span> <span class="b">lockdep_map</span> <span class="f">*</span><span class="b">nest_lock</span><span class="f">)</span><span class="f">;</span>
<a name="129" /><span class="False">     129:</span> 
<a name="130" /><span class="False">     130:</span> <span class="f">#</span> <span class="n">define</span> <a href="cpu.c_macros_noref.html#_ZG93bl93cml0ZV9uZXN0X2xvY2tfMA__"><span class="b">down_write_nest_lock</span></a><span class="f">(</span><span class="b">sem</span><span class="f">,</span> <span class="b">nest_lock</span><span class="f">)</span>            \
<a name="131" /><span class="False">     131:</span> <span class="m">do</span> <span class="f">{</span>                                \
<a name="132" /><span class="False">     132:</span>     <a href="cpu.c_macros_ref.html#_dHlwZWNoZWNrXzA_"><span class="b">typecheck</span></a><span class="f">(</span><span class="m">struct</span> <span class="b">lockdep_map</span> <span class="f">*</span><span class="f">,</span> <span class="f">&amp;</span><span class="f">(</span><span class="b">nest_lock</span><span class="f">)</span><span class="f">-&gt;</span><span class="b">dep_map</span><span class="f">)</span><span class="f">;</span>    \
<a name="133" /><span class="False">     133:</span>     <span class="b">_down_write_nest_lock</span><span class="f">(</span><span class="b">sem</span><span class="f">,</span> <span class="f">&amp;</span><span class="f">(</span><span class="b">nest_lock</span><span class="f">)</span><span class="f">-&gt;</span><span class="b">dep_map</span><span class="f">)</span><span class="f">;</span>    \
<a name="134" /><span class="False">     134:</span> <span class="f">}</span> <span class="m">while</span> <span class="f">(</span><span class="c">0</span><span class="f">)</span><span class="f">;</span>
<a name="135" /><span class="False">     135:</span> 
<a name="136" /><span class="False">     136:</span> <span class="k">/*</span>
<a name="137" /><span class="False">     137:</span> <span class="k"> * Take/release a lock when not the owner will release it.</span>
<a name="138" /><span class="False">     138:</span> <span class="k"> *</span>
<a name="139" /><span class="False">     139:</span> <span class="k"> * [ This API should be avoided as much as possible - the</span>
<a name="140" /><span class="False">     140:</span> <span class="k"> *   proper abstraction for this case is completions. ]</span>
<a name="141" /><span class="False">     141:</span> <span class="k"> */</span>
<a name="142" /><span class="False">     142:</span> <span class="m">extern</span> <span class="m">void</span> <a href="cpu.c_macros_noref.html#_ZG93bl9yZWFkX25vbl9vd25lcl8w"><span class="b">down_read_non_owner</span></a><span class="f">(</span><span class="m">struct</span> <span class="b">rw_semaphore</span> <span class="f">*</span><span class="b">sem</span><span class="f">)</span><span class="f">;</span>
<a name="143" /><span class="False">     143:</span> <span class="m">extern</span> <span class="m">void</span> <a href="cpu.c_macros_noref.html#_dXBfcmVhZF9ub25fb3duZXJfMA__"><span class="b">up_read_non_owner</span></a><span class="f">(</span><span class="m">struct</span> <span class="b">rw_semaphore</span> <span class="f">*</span><span class="b">sem</span><span class="f">)</span><span class="f">;</span>
<a name="144" /><span class="Maybe">     144:</span> <span class="f">#</span><span class="n">else</span>
<a name="145" /><span class="Maybe">     145:</span> <span class="f">#</span> <span class="n">define</span> <a href="cpu.c_macros_noref.html#_ZG93bl9yZWFkX25lc3RlZF8w"><span class="b">down_read_nested</span></a><span class="f">(</span><span class="b">sem</span><span class="f">,</span> <span class="b">subclass</span><span class="f">)</span>        <span class="b">down_read</span><span class="f">(</span><span class="b">sem</span><span class="f">)</span>
<a name="146" /><span class="Maybe">     146:</span> <span class="f">#</span> <span class="n">define</span> <a href="cpu.c_macros_noref.html#_ZG93bl93cml0ZV9uZXN0X2xvY2tfMA__"><span class="b">down_write_nest_lock</span></a><span class="f">(</span><span class="b">sem</span><span class="f">,</span> <span class="b">nest_lock</span><span class="f">)</span>    <span class="b">down_write</span><span class="f">(</span><span class="b">sem</span><span class="f">)</span>
<a name="147" /><span class="Maybe">     147:</span> <span class="f">#</span> <span class="n">define</span> <a href="cpu.c_macros_noref.html#_ZG93bl93cml0ZV9uZXN0ZWRfMA__"><span class="b">down_write_nested</span></a><span class="f">(</span><span class="b">sem</span><span class="f">,</span> <span class="b">subclass</span><span class="f">)</span>    <span class="b">down_write</span><span class="f">(</span><span class="b">sem</span><span class="f">)</span>
<a name="148" /><span class="Maybe">     148:</span> <span class="f">#</span> <span class="n">define</span> <a href="cpu.c_macros_noref.html#_ZG93bl9yZWFkX25vbl9vd25lcl8w"><span class="b">down_read_non_owner</span></a><span class="f">(</span><span class="b">sem</span><span class="f">)</span>        <span class="b">down_read</span><span class="f">(</span><span class="b">sem</span><span class="f">)</span>
<a name="149" /><span class="Maybe">     149:</span> <span class="f">#</span> <span class="n">define</span> <a href="cpu.c_macros_noref.html#_dXBfcmVhZF9ub25fb3duZXJfMA__"><span class="b">up_read_non_owner</span></a><span class="f">(</span><span class="b">sem</span><span class="f">)</span>            <span class="b">up_read</span><span class="f">(</span><span class="b">sem</span><span class="f">)</span>
<a name="150" /><span class="Maybe">     150:</span> <span class="f">#</span><span class="n">endif</span>
<a name="151" /><span class="Maybe">     151:</span> 
<a name="152" /><span class="True">     152:</span> <span class="f">#</span><span class="n">endif</span> <span class="k">/* _LINUX_RWSEM_H */</span>
<a name="153" /><span class="True">     153:</span> </pre>
  </body>
</html>
